/*                          UX-Framework                               
 *                                                                 
 *  iZE Co.,Ltd. Copyright 2009 All rights reserved.          
 *  This file is distributed under the terms of the GNU Lesser 
 *  General Public License, described in file LICENSE.                                     
 */

/**
 * 利便的なクラスや関数や型を集めたクラス。
 *
 * @author		iZE Co., Ltd.<br>
 * @version		$Id$<br>
 */
package jp.ize.ux;

import feffects.Tween;

// {{{ class Assoc<A, B>
/**
 * Assocクラス<br>
 * 連想構造クラスです。
 */
class Assoc<A, B>
{
	// {{{ properties

	var k : A;
	var v : B;

	// }}}
	// {{{ public function new( key : A, value : B )
	/**
	 * 連想構造のコンストラクタです。
	 */
	public function new( key : A, value : B )
	{
		k = key;
		v = value;
	}
	// }}}
	// {{{ public function key() : A
	/**
	 * キーを取り出す関数です。
	 */
	public function key() : A
	{
		return k;
	}
	// }}}
	// {{{ public function value() : B
	/**
	 * 値を取り出す関数です。
	 */
	public function value() : B
	{
		return v;
	}
	// }}}
}
// }}}
// {{{ class Pair<A, B>
/**
 * Pairクラス<br>
 * 2つのオブジェクトのペアを持つクラスです。
 */
class Pair<A, B>
{
	// {{{ properties

	var l : A;
	var r : B;

	// }}}
	// {{{ public function new( left : A, right : B )
	/**
	 * コンストラクタです。
	 */
	public function new( left : A, right : B )
	{
		l = left;
		r = right;
	}
	// }}}
	// {{{ public function left() : A
	/**
	 * 左側の値を取り出す射影関数です。
	 */
	public function left() : A
	{
		return l;
	}
	// }}}
	// {{{ public function right() : B
	/**
	 * 右側の値を取り出す射影関数です。
	 */
	public function right() : B
	{
		return r;
	}
	// }}}
}
// }}}
// {{{ class TweenUtil
class TweenUtil
{
	// {{{ public static function startTween(tw: Tween) {

	public static function startTween(tw: Tween) {
		for (t in Tween.getActiveTweens().iterator()) {
			if (Reflect.field(tw, "obj") == Reflect.field(t, "obj")
				&& Reflect.field(tw, "prop") == Reflect.field(t, "prop")) {
				t.stop();
			}
		}
		tw.start();
	}

	// }}}
	// {{{ public static function createTween<A> (obj: A, setter: (Float -> Void), getter: (A -> Float), goal: Float, duration: Int, ?easing: Easing) {

	// strong typed tween creater
	public static function createTween<A> (obj: A, setter: (Float -> Void), getter: (A -> Float), goal: Float, duration: Int, ?easing: Easing) {
		var init = getter (obj);
		var tw = new Tween(init, goal, duration, obj, easing);
		tw.setTweenHandlers(function(t: Float) { setter(t); });
		return tw;
	}

	// }}}
}
// }}}
